package tp.tecnicasdisenio.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

public class FileUtil {

  public static String pasarAString(File file) {
    try {
      FileInputStream fis = new FileInputStream(file);
      StringWriter output = new StringWriter();
      IOUtils.copy(fis, output);

      String string = output.toString();

      fis.close();
      output.close();

      return string;
    } catch(Exception e) {
      e.printStackTrace();
      throw new RuntimeException();
    }
  }

  public static List<File> listarDir(File dir) {
    return new LinkedList<File>(FileUtils.listFiles(dir, null, false));
  }

  public static String armarRuta(ArrayList<String> directorios) {
    String ruta = "";

    for (Iterator<String> it = directorios.iterator(); it.hasNext();) {
      ruta = ruta.concat(agregarSeparador(it.next()));
    }
    return ruta;
  }

  public static String agregarSeparador(String ruta) {
    if (!ruta.endsWith(File.separator))
      ruta = ruta.concat(File.separator);
    return ruta;
  }

  public static void copiarArchivoEnDirectorio(File archivoOrigen,
      String directorioDestino) {

    if (directorioDestino.isEmpty() || directorioDestino == null)
      throw (new RuntimeException("Ruta destino no especificada"));

    directorioDestino = FileUtil.agregarSeparador(directorioDestino);

    File destino = new File(directorioDestino);
    if (!destino.exists())
      destino.mkdirs();

    // se agrega a la ruta destino, el nombre del archivo a copiar
    directorioDestino = directorioDestino.concat(archivoOrigen.getName());

    if (!archivoOrigen.isDirectory()) {
      try {
        InputStream in;
        in = new FileInputStream(archivoOrigen);
        OutputStream out = new FileOutputStream(directorioDestino);
        byte[] buf = new byte[2048];
        int len;
        while ((len = in.read(buf)) > 0) {
          out.write(buf, 0, len);
        }
        in.close();
        out.close();
      } catch(FileNotFoundException e) {
        e.printStackTrace();
      } catch(IOException e) {
        e.printStackTrace();
      }
    }
  }

  public static void copiarDirectorio(String directorioOrigen,
      String directorioDestino, boolean borrarContenidoAnterior) {
    File archivoOrigen = new File(directorioOrigen), archivoDestino =
        new File(directorioDestino);

    if (!archivoOrigen.exists())
      throw (new RuntimeException("El directorio de origen no existe"));

    if (borrarContenidoAnterior)
      FileUtil.borrarDirectorio(directorioDestino);

    File listaArchivos[] = archivoOrigen.listFiles();

    String archivoHijoDestino;
    for (int i = 0; i < listaArchivos.length; i++) {
      if (listaArchivos[i].isDirectory()) {
        archivoHijoDestino =
            archivoDestino.getAbsolutePath() + File.separator
                + listaArchivos[i].getName();
        // se copian los archivos del directorio
        FileUtil.copiarDirectorio(listaArchivos[i].getAbsolutePath(),
            archivoHijoDestino, borrarContenidoAnterior);
      }
      else
        FileUtil.copiarArchivoEnDirectorio(listaArchivos[i],
            archivoDestino.getAbsolutePath());
    }
  }

  public static void borrarDirectorio(String ruta) {
    File archivo = new File(ruta);

    if (archivo.exists()) {
      if (archivo.isDirectory()) {
        File archivosDirectorio[] = archivo.listFiles();
        for (int i = 0; i < archivosDirectorio.length; i++) {
          if (archivosDirectorio[i].isDirectory())
            FileUtil.borrarDirectorio(archivosDirectorio[i].getAbsolutePath()
                + File.separator);
          archivosDirectorio[i].delete();
        }
      }
      archivo.delete();
    }
  }

}
